package com.naza.rpc.ratelimit;
import java.util.concurrent.TimeUnit;

/**
 * 流控器,包含两类：时刻流控、周期流控<br>
 * 时刻流控：表示在某一刻，并发处理的流量控制.<br>
 * 周期流控：表示在周期时间内（例如1秒之内），能受理的流量控制; 类guava的RateLimiter.<br>
 *
 * @author yl
 */
public abstract class RateLimiter {

    private String method;

    /**
     * 最大流量限制。
     */
    protected long maxPermits = -1;

    /**
     * 时刻流控模式
     *
     * @param maxPermits 每一刻的最大并发量
     */
    public RateLimiter(long maxPermits) {
        this.maxPermits = maxPermits;
    }

    /**
     * 获取一个许可令牌，该方法会被阻塞直到获取到请求.
     *
     * @return 实际获取的许可令牌数.
     */
    abstract void acquire();

    /**
     * 获取一个许可令牌，该方法会被阻塞到时间超时.
     *
     * @param timeout
     * @param unit
     * @return 实际获取的许可令牌数.
     */
    abstract public void acquire(long timeout, TimeUnit unit);

    /**
     * 获取一个许可令牌，该方法会尝试获取，获取不到立即返回.
     *
     * @return 实际获取的许可令牌数.
     */
    abstract public long tryAcquire();


    /**
     * 释放一个许可令牌，该方法只针对时刻流控模式
     */
    abstract public void release();

}
